package com.lms.stream;

import java.util.*;
import java.util.concurrent.ConcurrentMap;
import java.util.stream.Collector;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * @Author: 李孟帅
 * @CreateTime: 2020-07-07 07:41
 * @Description:
 */
public class CollectorDemo {
    public static void main(String[] args) {
        Integer[] ints = {9, 2, 3, 4, 7, 5, 8, 6, 1, 1};
//        返回其元素是指定值的顺序排序流。
        Stream<Integer> stream = Stream.of(ints);
//        返回一个 Collector ，它将输入元素 List到一个新的 List 。
//        List<Integer> collect = stream.collect(Collectors.toList());
//        返回一个 Collector ，将输入元素 Set到一个新的 Set 。
//        Set<Integer> collect1 = stream.collect(Collectors.toSet());
//        返回一个 Collector ，它将元素累加到一个 Map ，其键和值是将所提供的映射函数应用于输入元素的结果。如果映射的密钥可能有重复，请改用toMap(Function, Function, BinaryOperator) 。
//        Map<String, String> collect = stream.collect(Collectors.toMap(num -> "key-"+num, num -> "value-" + num));
//        返回一个并发的 Collector ，它将元素累加到 ConcurrentMap ，其键和值是将所提供的映射函数应用于输入元素的结果。
//        ConcurrentMap<String, String> collect = stream.collect(Collectors.toConcurrentMap(num -> "key-" + num, num -> "value-" + num));如果映射的密钥可能有重复，请改用toConcurrentMap(Function, Function, BinaryOperator) 。
//        返回一个 Collector ，按照遇到的顺序将输入元素累加到一个新的 Collection中。
//        ArrayList<Integer> list = new ArrayList<>();
//        list.add(1);
//        List<Integer> collect = stream.collect(Collectors.toCollection(() ->list));
//        返回 Collector类型的接受元件 T计数输入元件的数量。
//        Long collect = stream.collect(Collectors.counting());
//        返回一个 Collector ，它产生应用于输入元素的整数值函数的算术平均值。
//        Double collect = stream.collect(Collectors.averagingInt(num -> num + 1));
//        返回一个 Collector ， int生产映射函数应用于每个输入元素，并返回结果值的汇总统计信息。
//        Integer collect = stream.collect(Collectors.summingInt(num -> num));
//        返回一个 Collector ，它根据给出的 Comparator产生最大元素，描述为 Optional<T> 。
//         Optional<Integer> min = stream.max(Comparator.comparingInt(num -> -num));
        Optional<Integer> min = stream.min(Comparator.comparingInt(o -> o));
        Optional<Integer> max = Stream.of(ints).max(Comparator.comparingInt(num -> num));
        System.out.println(min.get());
        System.out.println(max.get());
//        返回一个 Collector ，按照遇到的顺序将输入元素连接到一个 String中。key为字符串类型
//        String collect = stream.map(num -> num + "-").collect(Collectors.joining());
//        返回 Collector “由基团”上的类型的输入元件操作实现 T ，根据分类功能分组元素，并且在返回的结果 Map 。
//        Map<String, List<Integer>> collect = stream.collect(Collectors.groupingBy(num -> "sf"));
    }
}
